/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package admin.recordatorio;

import DBMS.DataBaseManager;
import admin.permisos.PermisosManager;
import clases.Unidad;
import clases.Usuario;
import java.util.ArrayList;
import clases.Recordatorio;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

/**
 *
 * @author carlo
 */
public class EnviarRecordatorio extends DispatchAction {

    /*
     * forward name="success" path=""
     */
    private final static String SUCCESS = "success";
    private final static String FAILURE = "failure";
    private static final String name = "Enviar Recordatorio";

    /**
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception 
     */
    public ActionForward sendAll(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
//        Usuario usr = (Usuario) request.getSession().getAttribute("logueado");
//        DataBaseManager dbms = DataBaseManager.getInstance();
//        if (!PermisosManager.validar(this.name, dbms.consultarPermisoAccion(name), usr.getPermiso())) {
//            System.out.println("No tiene permiso");
//            return mapping.findForward(FAILURE);
//        }
        DataBaseManager dbms = DataBaseManager.getInstance();
        System.out.println("Empezando Funcion sendAll");

//        DataBaseManager dbms = DataBaseManager.getInstance();

        form = new Recordatorio();

        ArrayList<Recordatorio> valores = null;
        String fechaInicio = "";
        String fechaFin = "";
        String persona = "";
        String escrito = "";
        String asunto = "";
        String correo = "";
        ArrayList<Usuario> valores2 = null;

        valores = dbms.consultarRecordatorios((Recordatorio) form);
        for (Recordatorio r : valores) {
            //       System.out.println(r.getUnidad() + " " + r.getFechaInicio() + " " + r.getFechaFin());

            //       valores2 = dbms.consultarUsuarios(r.getUnidad());
            for (Usuario u : valores2) {
                System.out.println(u.getNombre() + " " + u.getCategoria());
                correo = u.getCorreo();
                persona = u.getNombre();
                escrito = "";
                asunto = "";
                fechaInicio = r.getFechaInicio();
                fechaFin = r.getFechaFin();

                //           escrito = "Saludos.\nSe le informa a " + persona + " de la unidad " + r.getUnidad() + " que tiene una matriz pendiente por completar. Debe ingresar los datos en el sistema entre los dias " + fechaInicio + " y " + fechaFin + ".\nGracias.";
                asunto = "Recordatorio";

                System.out.println(escrito);
                // Creamos el socket del cliente pasandole el servidor entrante externo y el número de puerto
                Socket socket_cliente = new Socket("localhost", 25); //nos conectamos con localhost

                // Creamos un flujo de entrada y leemos de él.
                BufferedReader entrada = new BufferedReader(new InputStreamReader(socket_cliente.getInputStream()));
                // Creamos un flujo de salida
                DataOutputStream salida = new DataOutputStream(socket_cliente.getOutputStream());

                // Escribimos datos en el canal de salida establecido con el puerto del protocolo SMTP del servidor
                if (socket_cliente != null && entrada != null && salida != null) {
                    salida.writeBytes("HELLO servidor.es\n");
                    salida.writeBytes("MAIL From: cpydcomisioncpyd@gmail.com\n");
                    salida.writeBytes("RCPT TO: " + correo + "\n");
                    salida.writeBytes("DATA\n");
                    salida.writeBytes("SUBJECT: " + asunto + "\n");
                    salida.writeBytes(escrito + "\n");
                    salida.writeBytes(".\n");
                    salida.writeBytes("QUIT\n");

                    // Los nombres en mayúsculas son comandos de SMTP

                    String respuesta;
                    while ((respuesta = entrada.readLine().toUpperCase()) != null) {
                        System.out.println("Servidor: " + respuesta);
                        if (respuesta.toUpperCase().indexOf("OK") != -1) //nos devuelve la posición del string “OK”
                        {
                            System.out.println("Ha sido recibido el OK del mensaje");
                        }
                        break;
                    }

                    // Cerramos los flujos de salida y de entrada y el socket cliente
                    salida.close();
                    entrada.close();
                    socket_cliente.close();
                }
            }
        }

        return mapping.findForward(SUCCESS);

    }

    public ActionForward sendAuto(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        System.out.println("Empezando Funcion sendAuto");

        DataBaseManager dbms = DataBaseManager.getInstance();

        form = new Recordatorio();

        ArrayList<Recordatorio> valores = null;
        String fechaInicio = "";
        String fechaFin = "";
        String persona = "";
        String escrito = "";
        String asunto = "";
        String correo = "";
        ArrayList<Usuario> valores2 = null;
        Date fechaActual;
        SimpleDateFormat formato;
        String cadenaFecha;
        valores = dbms.consultarRecordatorios((Recordatorio) form);
        for (Recordatorio r : valores) {
            //         System.out.println(r.getUnidad() + " " + r.getFechaInicio() + " " + r.getFechaFin());
            fechaActual = new Date();
            formato = new SimpleDateFormat("dd/MM/yyyy");
            cadenaFecha = formato.format(fechaActual);
            System.out.println(cadenaFecha + " hoy - fin" + r.getFechaFin());
            if (verificarPlazo(cadenaFecha, r.getFechaFin())) {

                System.out.println(" exito ");
                //             valores2 = dbms.consultarUsuarios(r.getUnidad());
                for (Usuario u : valores2) {
                    System.out.println(u.getNombre() + " " + u.getCategoria());
                    correo = u.getCorreo();
                    persona = u.getNombre();
                    escrito = "";
                    asunto = "";
                    fechaInicio = r.getFechaInicio();
                    fechaFin = r.getFechaFin();

                    //            escrito = "Saludos.\nSe le informa a " + persona + " de la unidad " + r.getUnidad() + " que tiene una matriz pendiente por completar. Debe ingresar los datos en el sistema entre los dias " + fechaInicio + " y " + fechaFin + ".\nGracias.";
                    asunto = "Recordatorio";

                    System.out.println(escrito);
                    // Creamos el socket del cliente pasandole el servidor entrante externo y el número de puerto
                    Socket socket_cliente = new Socket("localhost", 25); //nos conectamos con localhost

                    // Creamos un flujo de entrada y leemos de él.
                    BufferedReader entrada = new BufferedReader(new InputStreamReader(socket_cliente.getInputStream()));
                    // Creamos un flujo de salida
                    DataOutputStream salida = new DataOutputStream(socket_cliente.getOutputStream());

                    // Escribimos datos en el canal de salida establecido con el puerto del protocolo SMTP del servidor
                    if (socket_cliente != null && entrada != null && salida != null) {
                        salida.writeBytes("HELO servidor.es\n");
                        salida.writeBytes("MAIL From: cpydcomisioncpyd@gmail.com\n");
                        salida.writeBytes("RCPT TO: " + correo + "\n");
                        salida.writeBytes("DATA\n");
                        salida.writeBytes("SUBJECT: " + asunto + "\n");
                        salida.writeBytes(escrito + "\n");
                        salida.writeBytes(".\n");
                        salida.writeBytes("QUIT\n");

                        // Los nombres en mayúsculas son comandos de SMTP

                        String respuesta;
                        while ((respuesta = entrada.readLine().toUpperCase()) != null) {
                            System.out.println("Servidor: " + respuesta);
                            if (respuesta.toUpperCase().indexOf("OK") != -1) //nos devuelve la posición del string “OK”
                            {
                                System.out.println("Ha sido recibido el OK del mensaje");
                            }
                            break;
                        }

                        // Cerramos los flujos de salida y de entrada y el socket cliente
                        salida.close();
                        entrada.close();
                        socket_cliente.close();
                    }
                }
            }
        }

        return mapping.findForward(SUCCESS);

    }

    public ActionForward sendOne(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        System.out.println("Empezando Funcion sendOne");

        DataBaseManager dbms = DataBaseManager.getInstance();

        Recordatorio r = (Recordatorio) form;

        String fechaInicio = "";
        String fechaFin = "";
        String persona = "";
        String escrito = "";
        String asunto = "";
        String correo = "";
        ArrayList<Usuario> valores = null;
        System.out.println("unidad recibida: " + r.getUnidad());

        valores = dbms.consultarUsuarios(r.getUnidad());
        for (Usuario u : valores) {
            System.out.println(u.getNombre() + " " + u.getCategoria());
            correo = u.getCorreo();
            persona = u.getNombre();
            escrito = "";
            asunto = "";
            fechaInicio = r.getFechaInicio();
            fechaFin = r.getFechaFin();

            escrito = "Saludos.\nSe le informa a " + persona + " de la unidad " + r.getUnidad() + " que tiene una matriz pendiente por completar. Debe ingresar los datos en el sistema entre los dias " + fechaInicio + " y " + fechaFin + ".\nGracias.";
            asunto = "Recordatorio";

            System.out.println(escrito);
            // Creamos el socket del cliente pasandole el servidor entrante externo y el número de puerto
            Socket socket_cliente = new Socket("localhost", 25); //nos conectamos con localhost

            // Creamos un flujo de entrada y leemos de él.
            BufferedReader entrada = new BufferedReader(new InputStreamReader(socket_cliente.getInputStream()));
            // Creamos un flujo de salida
            DataOutputStream salida = new DataOutputStream(socket_cliente.getOutputStream());

            // Escribimos datos en el canal de salida establecido con el puerto del protocolo SMTP del servidor
            if (socket_cliente != null && entrada != null && salida != null) {
                salida.writeBytes("HELLO servidor.es\n");
                salida.writeBytes("MAIL From: cpydcomisioncpyd@gmail.com\n");
                salida.writeBytes("RCPT TO: " + correo + "\n");
                salida.writeBytes("DATA\n");
                salida.writeBytes("SUBJECT: " + asunto + "\n");
                salida.writeBytes(escrito + "\n");
                salida.writeBytes(".\n");
                salida.writeBytes("QUIT\n");

                // Los nombres en mayúsculas son comandos de SMTP

                String respuesta;
                while ((respuesta = entrada.readLine().toUpperCase()) != null) {
                    System.out.println("Servidor: " + respuesta);
                    if (respuesta.toUpperCase().indexOf("OK") != -1) //nos devuelve la posición del string “OK”
                    {
                        System.out.println("Ha sido recibido el OK del mensaje");
                    }
                    break;
                }

                // Cerramos los flujos de salida y de entrada y el socket cliente
                salida.close();
                entrada.close();
                socket_cliente.close();
            }
        }

        return mapping.findForward(SUCCESS);

    }

    public ActionForward populate(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {

        return mapping.findForward("page");
    }

    private boolean verificarPlazo(String fechaHoy, String fechaFin) {
        String[] hoy;
        String[] fin;
        hoy = fechaHoy.split("/");
        fin = fechaFin.split("/");
        if (Integer.parseInt(fin[2]) != Integer.parseInt(hoy[2])) {
            System.out.println("yyyy");
            return false;
        }
        if (Integer.parseInt(fin[1]) != Integer.parseInt(hoy[1])) {
            System.out.println("MM");
            return false;
        }
        if ((Integer.parseInt(fin[0]) - Integer.parseInt(hoy[0]) > 2) || (Integer.parseInt(fin[0]) - Integer.parseInt(hoy[0]) < 0)) {
            System.out.println("dd");
            return false;
        }

        return true;
    }
}
